


#include "GameMain.h"

#include "WindowsX.h"

#include "2dDraw.h"

BITMAP_FILE          bitmap8bit;             // a 8 bit bitmap file
BITMAP_FILE          bitmap16bit;            // a 16 bit bitmap file
BITMAP_FILE          bitmap24bit;            // a 24 bit bitmap file


LRESULT CALLBACK WindowProc(HWND hwnd, 
							UINT msg, 
							WPARAM wparam, 
							LPARAM lparam)
{
	// this is the main message handler of the system
	PAINTSTRUCT	ps;		   // used in WM_PAINT
	HDC			hdc;	   // handle to a device context

	// what is the message 
	switch(msg)
	{	
	case WM_CREATE: 
		{
			// do initialization stuff here
			return(0);
		} break;

	case WM_PAINT:
		{
			// start painting
			hdc = BeginPaint(hwnd,&ps);

			// end painting
			EndPaint(hwnd,&ps);
			return(0);
		} break;

	case WM_DESTROY: 
		{
			// kill the application			
			PostQuitMessage(0);
			return(0);
		} break;

	default:break;

	} // end switch

	// process any messages that we didn't take care of 
	return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc


CGameMain::CGameMain()
{

}

CGameMain::~CGameMain()
{

}

int CGameMain::Init(HINSTANCE hinstance, LPTSTR lpcmdline, LPTSTR lpWndClassName, LPTSTR lpWndTitle, int WndWidth, int WndHeight, int bpp, BOOL bFullScreen)
{
	m_hInstance				= hinstance;
	m_lpcmdline				= lpcmdline;

	m_WndClassName			= lpWndClassName;
	m_WndTitle				= lpWndTitle;
	m_WndWidth				= WndWidth;
	m_WndHeight				= WndHeight;
	m_bpp					= bpp;
	m_bFullScreen			= bFullScreen;

	return 0;
}

int CGameMain::Run()
{
	WNDCLASS winclass;	// this will hold the class we create
	MSG		 msg;		// generic message
	HDC      hdc;       // generic dc
	PAINTSTRUCT ps;     // generic paintstruct

	// first fill in the window class stucture
	winclass.style			= CS_DBLCLKS | CS_OWNDC | 
		CS_HREDRAW | CS_VREDRAW;
	winclass.lpfnWndProc	= WindowProc;
	winclass.cbClsExtra		= 0;
	winclass.cbWndExtra		= 0;
	winclass.hInstance		= m_hInstance;
	winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	winclass.hCursor		= LoadCursor(NULL, IDC_ARROW);
	winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
	winclass.lpszMenuName	= NULL; 
	winclass.lpszClassName	= (LPCTSTR)m_WndClassName.c_str();

	// register the window class
	if (!RegisterClass(&winclass))
		return -1;

	// create the window, note the test to see if WINDOWED_APP is
	// true to select the appropriate window flags
	if (!(m_hWnd = CreateWindow((LPCSTR)m_WndClassName.c_str(), // class
		(LPCSTR)m_WndTitle.c_str(),	 // title
		(m_bFullScreen ? (WS_POPUP | WS_VISIBLE) : (WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION)),
		0,0,	   // x,y
		m_WndWidth,  // width
		m_WndHeight, // height
		NULL,	   // handle to parent 
		NULL,	   // handle to menu
		m_hInstance,// instance
		NULL)))	// creation parms
		return -1;


	// resize the window so that client is really width x height
	if (m_bFullScreen == FALSE)
	{
		// now resize the window, so the client area is the actual size requested
		// since there may be borders and controls if this is going to be a windowed app
		// if the app is not windowed then it won't matter
		RECT window_rect = {0,0,m_WndWidth-1,m_WndHeight-1};

		// make the call to adjust window_rect
		AdjustWindowRectEx(&window_rect,
			GetWindowStyle(m_hWnd),
			GetMenu(m_hWnd) != NULL, 
			GetWindowExStyle(m_hWnd));

		// save the global client offsets, they are needed in DDraw_Flip()
		m_Window_client_x0 = -window_rect.left;
		m_Window_client_y0 = -window_rect.top;

		// now resize the window with a call to MoveWindow()
		MoveWindow(m_hWnd,
			0, // x position
			0, // y position
			window_rect.right - window_rect.left, // width
			window_rect.bottom - window_rect.top, // height
			FALSE);

		// show the window, so there's no garbage on first render
		ShowWindow(m_hWnd, SW_SHOW);
	} // end if windowed

	// perform all game console specific initialization
	Game_Init();

	// disable CTRL-ALT_DEL, ALT_TAB, comment this line out 
	// if it causes your system to crash
	SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, NULL, 0);

	// enter main event loop
	while(1)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{ 
			// test if this is a quit
			if (msg.message == WM_QUIT)
				break;

			// translate any accelerator keys
			TranslateMessage(&msg);

			// send the message to the window proc
			DispatchMessage(&msg);
		} // end if

		// main game processing goes here
		Game_Main();

	} // end while

	// shutdown game and release all resources
	Game_Shutdown();

	// enable CTRL-ALT_DEL, ALT_TAB, comment this line out 
	// if it causes your system to crash
	SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, NULL, 0);

	// return to Windows like this
	return(msg.wParam);
}

int CGameMain::Stop()
{
	return  0;
}

int CGameMain::Game_Init()
{
	return 0;

} // end Game_Init


int	CGameMain::Game_Main()
{
	return 0;
}

int	CGameMain::Game_Shutdown()
{
	// this function is where you shutdown your game and
	// release all resources that you allocated

	// shut everything down

	//// now directsound
	m_gameSound.Stop_All_Sounds();
	m_gameSound.Delete_All_Sounds();
	m_gameSound.Shutdown();

	//// directmusic
	m_gameMusic.Delete_All_MIDI();
	m_gameMusic.Shutdown();

	// shut down directinput
	m_gameInput.Shutdown();

	// shutdown directdraw last
	m_ddraw.Shutdown();

	return 0;
}

